package com.rockcent.common.utils;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * Created by oyhk on 16/3/7.
 */
public class RDateUtils extends DateUtils {

    public static final String parsePattern = "yyyy-MM-dd HH:mm:ss";
    public static final String parseDatePattern = "yyyy-MM-dd";

    /**
     * 判读字符串是否符合日期格式
     * true:是 false:否
     * @param dateText
     * @param parsePattern
     * @return
     */
    public static boolean isDate(String dateText, String parsePattern) {
        try {
            DateUtils.parseDate(dateText, parsePattern);
        } catch (ParseException e) {
            return false;
        }
        return true;
    }

    /**
     * 判读字符串是否符合日期格式
     * true:是 false:否
     * @param dateText
     * @return
     */
    public static boolean isNotDate(String dateText) {
        try {
            DateUtils.parseDate(dateText, parsePattern);
        } catch (ParseException e) {
            return true;
        }
        return false;
    }

    public static Date parseDate(String dateText) throws ParseException {
        return DateUtils.parseDate(dateText,parsePattern);
    }

    /**
     * 判读字符串是否符合日期格式
     * true:是 false:否
     * @param dateText
     * @return
     */
    public static boolean isDate(String dateText) {
        return isDate(dateText, parsePattern);
    }

    /**
     * 获取当前时间的之前日子
     * @param days 天数
     * @return
     */
    public static Date beforeDate(int days){
        return DateUtils.addDays(new Date(), -days);
    }

    /**
     * 时间前一天
     * @param dateStr 时间
     * @return
     */
    public static Date beforeDateStr(String dateStr, int days) throws ParseException {
        Date date = DateUtils.parseDate(dateStr, parseDatePattern);
        return DateUtils.addDays(date, -days);
    }

    /**
     * 时间后天一天
     * @param dateStr 时间
     * @return
     */
    public static Date afterDateStr(String dateStr, int days) throws ParseException {
        Date date = DateUtils.parseDate(dateStr, parseDatePattern);
        return DateUtils.addDays(date, days);
    }

    /**
     * 比较两个日期的大小。<br>
     * 若date1 > date2 则返回 1<br>
     * 若date1 = date2 则返回 0<br>
     * 若date1 < date2 则返回-1
     * @param date1
     * @param date2
     * @param format  待转换的格式
     * @return 比较结果
     */
    public static int compare(String date1, String date2,String format) {
        DateFormat df = getFormat(format);
        try {
            Date dt1 = df.parse(date1);
            Date dt2 = df.parse(date2);
            if (dt1.getTime() > dt2.getTime()) {
                return 1;
            } else if (dt1.getTime() < dt2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取日期显示格式，为空默认为yyyy-mm-dd HH:mm:ss
     * @param format
     * @return
     * @return SimpleDateFormat
     */
    protected static SimpleDateFormat getFormat(String format){
        if(format == null || "".equals(format)){
            format = parsePattern;
        }
        return new SimpleDateFormat(format);
    }

    /**
     * 根据指定格式获取当前时间
     * @param format
     * @return String
     */
    public static String getCurrentTime(String format){
        SimpleDateFormat sdf = getFormat(format);
        Date date = new Date();
        return sdf.format(date);
    }

    /**
     * 获取当前时间，格式为：yyyy-MM-dd HH:mm:ss
     * @return String
     */
    public static String getCurrentTime(){
        return getCurrentTime(parsePattern);
    }

    /**
     * 将日期格式转换成String
     * @param value 需要转换的日期
     * @return String
     */
    public static String date2String(Date value, String format){
        if(value == null){
            return null;
        }
        if (format == null || Objects.equals("", format)) {
            format = parseDatePattern;
        }
        SimpleDateFormat sdf = getFormat(format);
        return sdf.format(value);
    }
}
